/******************************************************************************/
/* zzg.h : zzg Version 1.3                                                    */
/* A C++/Qt4 program : to plan scheduled computer shut down                   */
/* Ptyxs (Cassian Braconnier) - july 2010                                     */
/* Lic. GPLv3                                                                 */
/* Provided with no guaranty whatsoever.                                      */
/******************************************************************************/

//------------------------------------------------------------------------------

#ifndef ZZG_H
#define ZZG_H

//------------------------------------------------------------------------------

#define QTSOUNDRSCBUG

//------------------------------------------------------------------------------

#include <QDialog>

#include <Phonon/MediaObject>
#include <Phonon/AudioOutput>

//------------------------------------------------------------------------------

class QFrame;
class QLabel;
class QLineEdit;
class QHBoxLayout;
class QRegExpValidator;
class QVBoxLayout;
class QProcess;
class QProgressBar;
class QPushButton;
class QString;
class QTimer;

//------------------------------------------------------------------------------

// déclaration de la classe du widget central de l'application
class Zzg : public QDialog
{

    Q_OBJECT // cuisine interne de Qt

public:

    Zzg(QWidget *parent = 0); // constructeur
    ~Zzg(); // destructeur
    QPushButton * closeButton;

    // le chronomètre
    QTimer *timer;
    static const uint timerInterval;

    // l'émetteur de sons
    Phonon::MediaObject *someNoise90;
    Phonon::MediaObject *someNoise30;

    void qtBugHack();
    void qtSoundBugCleaner();


public slots:
    void setNoisyWarning(bool);

private slots:

    void timeout(); // sur 'tic' du chronomètre

    void validate(); // sur clic du bouton Valider
    void cancel();  // sur clic du bouton Annuler

    void minutes(QString time); // fonction linguistique sur entrée d'une nouvelle durée

private:

/// la fonction qui lance les commandes d'extinction
    void shutdownIf();

/// cherche la commande qdbus pour KDE
    static QString findQdbus();

/// les commandes d'extinction
    void gnomeShutdown();
    void kdeShutdown();
    void otherShutdown();

/// le menu musical à jouer en guise de notification
    static QList<QUrl> setNotificationSoundQueue();

/// des pointeurs vers les objets constitutifs de l'application
/// qui seront créés et paramétrés dans le constructeur

// les éléments graphiques (widgets, conteneurs...)
    QFrame * line;
    QLabel * label1;
    QLabel * label2;
    QLineEdit * lineEdit;
    QHBoxLayout * hLayout1;
    QHBoxLayout * hLayout2;
    QHBoxLayout * hLayout3;
    QProgressBar * progressBar;
    QPushButton * validateButton;    
    QPushButton * cancelButton;       
    QVBoxLayout * vLayout;

// le validateur qui contraindra la frappe de l'utilisateur
    QRegExpValidator * myValidator;

// le processus qui éteindra l'ordi
    QProcess * myProcess;

/// la durée avant extinction

    uint remnant; //durée restante courante

/// la durée par défaut avant extinction

    static const uint defaultRemnantTime;
    void setDefaultRemnantTime(QLineEdit *lineEd);

/// les commande qui lanceront le processus d'extinction
    //pour GNOME
    static const QString gnomeCmd;
    static const QString gnomeArgs;
    //pour KDE
    static const QString kdeCmd;
    static const QString kdeArgs;
    //autre bureau
    static const QString otherCmd;
    static const QString otherArgs;

/// temps d'attente maximum avant extinction
    static const uint maxRemnantTime;

/// nombre de chiffres maximum du temps d'attente
    static const uint maxRemnantLength;

/// temps d'attent avant extinction de la fenêtre de GOME
    static const uint gnomeDialogDisplayTime;

/// identité du bureau courant (GNOME, KDE...)
    static const QString desktop;

/// localisation des fichiers de sons
#ifdef QTSOUNDRSCBUG
    static const QString soundCopyDir;
#endif
    static const QString soundResourceDir;
    static const QString soundToPlayDir;
    QStringList soundFiles;

/// option avertissement sonore
    bool noisyWarning;

/// liste de fichiers sonores
    static const QList<QUrl> queue;

/// jouer la notification sonore
    void playMyQueue(Phonon::MediaObject *mediaObject, const QList<QUrl> list);
};

//------------------------------------------------------------------------------

#endif // ZZG_H
